package com.demo.common.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;
import jakarta.validation.constraints.*;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * (ShoppingCart)
 *
 * @author why
 * @since 2025-08-18 13:46:28
 */
@Data
@TableName("shopping_cart")
public class ShoppingCart implements Serializable {

    private static final long serialVersionUID = 514361046162396271L;

    /**
     * 购物车记录唯一标识符
     **/
    @TableId(type = IdType.AUTO)
    private Long cartId;

    /**
     * 用户唯一标识符，外键关联用户表
     **/
    @NotNull(message = "用户ID不能为空")
    @Positive(message = "用户ID必须为正数")
    private Long userId;

    /**
     * 商品唯一标识符，外键关联商品表
     **/
    @NotNull(message = "商品ID不能为空")
    @Positive(message = "商品ID必须为正数")
    private Long productId;

    /**
     * 商品数量，默认1件
     **/
    @NotNull(message = "商品数量不能为空")
    @Min(value = 1, message = "商品数量至少为1件")
    @Max(value = 999, message = "商品数量不能超过999件")
    private Integer quantity;

    /**
     * 商品价格，保留两位小数
     **/
    @NotNull(message = "商品价格不能为空")
    @DecimalMin(value = "0.01", message = "商品价格必须大于0")
    @Digits(integer = 10, fraction = 2, message = "商品价格格式不正确，最多10位整数2位小数")
    private BigDecimal price;

    /**
     * 商品总价，计算字段：数量 * 单价
     **/
    private BigDecimal totalPrice;

    /**
     * 是否支付
     **/
    private String isPay;

    /**
     * 商品加入购物车的时间
     **/
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /**
     * 购物车记录最后更新时间
     **/
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    /**
     * 获取购物车ID的便捷方法
     * @return 购物车ID
     */
    public Long getId() {
        return this.cartId;
    }
}



